package com.example.gulimall.seckill.scheduled;


import com.example.common.constant.CouponConstant;
import com.example.gulimall.seckill.service.SecKillService;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;

/**
 * 定时任务自动配置类：org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration
 *
 * 非阻塞任务调度：
 *  定时任务：
 *      1. @EnableScheduling    : 开启定时任务
 *      2. @Scheduled           ：定时任务目标方法开启定时执行
 *      3. 自动配置类： TaskSchedulingAutoConfiguration
 *  异步任务：
 *      1. @EnableAsync         ： 开启异步执行
 *      2. @Async               ： 异步执行目标方法
 *      3. 自动配置类: TaskExecutionAutoConfiguration
 */
@Slf4j
@Component
//@EnableAsync
//@EnableScheduling
public class SecKillSkuScheduled {

    @Autowired private SecKillService secKillService;
    @Autowired private RedissonClient redissonClient;


    /**
     * 上架最近三天的所有秒杀商品
     */
    @Scheduled(cron = "0 0 3 * * ?")
//    @Scheduled(cron = "*/5 * * * * ?")
    public void uploadSecKillSkuLatest () {
        // 使用分布式锁来完成不同服务之间相互执行的问题
        RLock lock = this.redissonClient.getLock(CouponConstant.UPLOAD_LOCK);
        try {
            log.info("秒杀商品开始上架：{}", LocalDateTime.now());
            lock.lock(10, TimeUnit.SECONDS);
            secKillService.uploadSecKillSkuLatest();
        }finally {
            lock.unlock();
        }
    }

}
